<?php

class Captcha
{
	function __construct($width='120',$height='40',$characters='6') 
	{
		$this->code = self::generateCode($characters);
	}
   
	public function asPict() 
	{
		$this->simple($this->code);
	}

   
   public function elaborate($code)
   {
   	/* font size will be 75% of the image height */
      $font_size = $height * 0.75;
      $image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
      
      /* set the colours */
      $background_color = imagecolorallocate($image, 255, 255, 255);
      $text_color = imagecolorallocate($image, 20, 40, 100);
      $noise_color = imagecolorallocate($image, 100, 120, 180);
      
      /* generate random dots in background */
      for( $i=0; $i<($width*$height)/3; $i++ ) {
         imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
      }
      
      /* generate random lines in background */
      for( $i=0; $i<($width*$height)/150; $i++ ) {
         imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
      }
      
/*
   	$this->font = 'monofont.ttf';
      $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
      $x = ($width - $textbox[4])/2;
      $y = ($height - $textbox[5])/2;
      imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
*/
		imagestring($image, 5, 10, 5, $code, $text_color);    
      
      header('Content-Type: image/jpeg');
      imagejpeg($image);
      imagedestroy($image);
   }
   
   
   public function simple($code)
   {
   	// create a 100*30 image
		$im = imagecreate(100, 30);
		
		// white background and blue text
		$bg = imagecolorallocate($im, 255, 153, 00);
		$textcolor = imagecolorallocate($im, 255, 255, 255);
		
		// write the string at the top left
		imagestring($im, 5, 15, 5, $code, $textcolor);
		
		// output the image
		header("Content-type: image/jpeg");
		imagejpeg($im);
		imagedestroy($im);
   }
   

   static public function generateCode($length) 
   {
      /* list all possible characters, similar looking characters and vowels have been removed */
      $possible = '23456789bcdfghjkmnpqrstvwxyz';
      $code = '';
      for ($i=0; $i<$length; ++$i) 
	  { 
         $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
      }
      return $code;
   }
   
   
   private $code = '';
};
?>